class EventEmeitter {
	private events: Map<string, any>;
	private _maxListeners: number;
	constructor(maxListeners?: number) {
		this.events = new Map();
		this._maxListeners = maxListeners || 20;
	}
	// 发布
	emit(type: string, ...args: any[]) {
		let handler;
		handler = this.events.get(type);
		if (Array.isArray(handler)) {
			for (let i = 0; i < handler.length; i++) {
				if (args.length > 0) {
					handler[i].apply(this, args);
				} else {
					handler[i].apply(this);
				}
			}
		} else {
			if (args.length > 0) {
				handler.apply(this, args);
			} else {
				handler.apply(this);
			}
		}
		return true;
	}
	//  添加监听事件
	addEventListener(type: string, fn: Function) {
		const handler = this.events.get(type); // 获取对应事件名称的函数
		if (!handler) {
			this.events.set(type, fn);
		} else if (handler && typeof handler === 'function') {
			// 如果handler是函数说明当前只有一个监听函数
			this.events.set(type, [handler, fn]);
		} else {
			if (handler.length <= this._maxListeners) return handler.push(fn); // 添加多个监听有上限
		}
	}

	// 移除监听事件
	removeListener(type: string, fn: Function) {
		const handler = this.events.get(type); // 获取对应事件名称的函数
		// 如果是函数,说明只被监听了一次
		if (handler && typeof handler === 'function') {
			this.events.delete(type);
		} else {
			// 如果handler是数组，说明被多次监听，需要找到对应的函数的位置
			let position;
			for (let i = 0; i < handler.length; i++) {
				if (handler[i] === fn) {
					position = i;
				} else {
					position = -1;
				}
			}
			// 如果找到匹配的函数
			if (position !== -1) {
				// 直接删除
				handler.splice(position, 1);
				// 如果清除后只有一个函数,那么取消数组,以函数形式保存
				if (handler.length === 1) {
					this.events.set(type, handler[0]);
				}
			} else {
				return this;
			}
		}
	}
}

export default EventEmeitter;
